package com.smart.community.property.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.smart.community.commons.base.BaseEntity;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;

/**
 * 计费方式实体类
 * 
 * 严格按照《Java后端SpringBoot代码开发规范.md》Entity规范实现：
 * - 继承BaseEntity：获得标准字段（id、createTime、updateTime、createBy、updateBy、version、deleted）
 * - 功能单一原则：Entity类必须是单纯的数据库字段映射的Bean对象，功能必须单一
 * - 禁止枚举类：所有枚举字段都使用String类型存储，避免使用枚举类
 * - 禁止工具方法：只保留基本的getter/setter方法，禁止添加工具方法
 * - 完整注释：所有字段都有完整的JavaDoc注释
 * - 字段映射：使用@TableField注解正确映射数据库字段
 * 
 * @author Wu.Liang
 * @since 2025-01-30
 * @version 3.0.0 - 根据新Entity规范调整
 */
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("sc_billing_method")
@Schema(description = "计费方式实体")
public class BillingMethod extends BaseEntity {
    private static final long serialVersionUID = -4185113254535754197L;

    /**
     * 物业公司ID
     */
    @Schema(description = "物业公司ID")
    @NotNull(message = "物业公司ID不能为空")
    @TableField("property_company_id")
    private Long propertyCompanyId;

    /**
     * 费用类型（使用String类型存储）
     */
    @Schema(description = "费用类型")
    @NotBlank(message = "费用类型不能为空")
    @TableField("fee_type")
    private String feeType;

    /**
     * 建筑类型名称：如"住宅楼"、"商业楼"、"办公楼"、"综合楼"等，NULL表示适用于所有建筑类型
     */
    @Schema(description = "建筑类型名称：如\"住宅楼\"、\"商业楼\"、\"办公楼\"、\"综合楼\"等，NULL表示适用于所有建筑类型")
    @TableField("building_type_name")
    private String buildingTypeName;

    /**
     * 计费方式名称
     */
    @Schema(description = "计费方式名称")
    @NotBlank(message = "计费方式名称不能为空")
    @TableField("method_name")
    private String methodName;

    /**
     * 计费类型（0-按面积计费，1-固定费用，2-阶梯计费，3-按表计费，4-阶梯电价）
     */
    @Schema(description = "计费类型：0-按面积计费，1-固定费用，2-阶梯计费，3-按表计费，4-阶梯电价")
    @NotNull(message = "计费类型不能为空")
    @TableField("method_type")
    private Integer methodType;

    /**
     * 单价（元/㎡或元/m³或元/kWh等）
     */
    @Schema(description = "单价（元/㎡或元/m³或元/kWh等）")
    @TableField("unit_price")
    private BigDecimal unitPrice;

    /**
     * 固定金额（元）
     */
    @Schema(description = "固定金额（元）")
    @TableField("fixed_amount")
    private BigDecimal fixedAmount;

    /**
     * 阶梯配置JSON格式
     */
    @Schema(description = "阶梯配置JSON格式")
    @TableField("tier_config")
    private String tierConfig;

    /**
     * 计费方式描述
     */
    @Schema(description = "计费方式描述")
    @TableField("description")
    private String description;

    /**
     * 状态（0-禁用，1-启用）
     */
    @Schema(description = "状态：0-禁用，1-启用")
    @TableField("status")
    private Integer status;

    /**
     * 排序
     */
    @Schema(description = "排序")
    @TableField("sort_order")
    private Integer sortOrder;

    // 只包含基本的getter/setter方法，不包含任何工具方法
}
